﻿// See https://aka.ms/new-console-template for more information
//迭代器模式
//迭代器模式是一种设计模式，他提供了一种方法来遍历集合对象的元素，而无需暴露集合对象的内部实现。
//迭代器模式的核心思想是将遍历集合的行为封装刀迭代器对象中，从而可以通过迭代器对象遍历集合的元素。这样，客户端代码就可以通过迭代器对象遍历集合，而无需了解集合对象的内部结构和实现细节。
//迭代器模式由四个对象构成
//·Aggregate（抽象聚合对象）：抽象聚合对象是所有的聚合对象的父类，他提供一个获取迭代器的方法，在.net中这个方法被封装在了另一个接口中，其实为了更加彻底的解耦，我们也可以采用.net的方法，将Getlterator单独封装在一个接口中。
//·ConcreteAggregate（具体聚合对象）：具体的聚合对象，负责存储数据和获得迭代器，以方便遍历。
//·Abstractlterator（抽象迭代器）：抽象迭代器中有如何遍历聚合对象的基础方法，在具体迭代器中我们需要实现这些方法。
//·Concretelterator(具体迭代器)：具体迭代器负责实现抽象迭代器中的方法，并且要实现自己独有的遍历方法，一般我们可以在具体迭代器中书写当前迭代器的迭代逻辑。
using System.Collections;

ConcreteAggregate ConcreteAggregate=new ConcreteAggregate();
ConcreteAggregate[0] = "A";
ConcreteAggregate[1] = "B";
ConcreteAggregate[2] = "C";

IIterator iterator= ConcreteAggregate.CreateIterator();
while (iterator.HasNext())
{
    object item = iterator.Next();
    Console.WriteLine(item);
}


Console.WriteLine("Hello, World!");

//定义迭代器接口
public interface IIterator
{
    bool HasNext();//是否还有下一个元素
    object Next();//获取下一个元素
}
//定义集合类接口
public interface IAggregate
{
    IIterator CreateIterator();//创建迭代器
}
//具体集合类
public class ConcreteAggregate : IAggregate
{
    private ArrayList _items=new ArrayList();//内部存储元素的数组
    public IIterator CreateIterator()
    {
        return new ConcreteIterator(this);
    }
    public int Count
    {
        get { return _items.Count; }
    }
    public object this[int index]
    {
        get { return _items[index]; }
        set { _items.Insert(index,value);}
    }
}

//具体迭代器类
public  class ConcreteIterator : IIterator
{
    private ConcreteAggregate _aggregate;//引用具体集合类
    private int _index = 0;//当前遍历到匀速索引

    public ConcreteIterator(ConcreteAggregate concreteAggregate)
    {
        _aggregate= concreteAggregate;
    }
    public bool HasNext()
    {
        return _index < _aggregate.Count;//判断是否还有下一个元素
    }
    public object Next()
    {
        if (HasNext())
        {
            return _aggregate[_index++];//获取下一个元素
        }
        else
            return null;
    }
}